#pragma once

#include <opencv2/opencv.hpp>
#include <string>
#include <thread>
#include <mutex>
#include <atomic>
#include <chrono>

class RtspCapture
{
public:
    // pipeline: GStreamer 管道字符串
    explicit RtspCapture(const std::string& pipeline);

    // 析构时自动停止线程
    ~RtspCapture();

    // 启动后台抓取线程
    void start();

    // 停止后台抓取线程
    void stop();

    // 获取最新一帧（拷贝），成功返回 true，当前还没帧返回 false
    bool getFrame(cv::Mat& out_frame);

    // 当前是否已经打开 RTSP
    bool isOpened() const { return is_opened_; }

private:
    void captureLoop();   // 线程函数
    bool openRtsp();      // 尝试打开 RTSP

    std::string pipeline_;
    cv::VideoCapture cap_;

    std::thread capture_thread_;
    std::atomic<bool> running_{false};
    std::atomic<bool> is_opened_{false};

    cv::Mat latest_frame_;
    mutable std::mutex frame_mutex_;

    std::chrono::steady_clock::time_point last_retry_time_;
};
